/*** Created Time: 2022年5月13日 22:13:24 ***/
/*** Author: Eric                        ***/

#include <onix/assert.h>
#include <onix/stdarg.h>
#include <onix/types.h>
#include <onix/stdio.h>
#include <onix/printk.h>

static u8 buf[1024];

// 辅助函数，强制阻塞
static void spin(char *name)
{
    printk("spinning in %s ...\n", name);
    while(true) {
        // 死循环
    }
}

// 断言失败处理
void assertion_failure(char *exp, char *file, char *base, int line)
{
    printk(
        "\n--> assert(%s) failed!!!\n"
        "--> file: %s \n"
        "--> base: %s \n"
        "--> line: %d \n",
        exp, file, base, line);
    
    spin("assertion_failure()");

    // 不可能运行到这里，否则出错
    // GCC内联汇编
    // UD2 : 让CPU产生invalid opcode exception的软件指令
    //        内核发现CPU出现这个异常时, 会立即停止运行
    asm volatile("ud2");
}

// 致命错误处理
void panic(const char *fmt, ...)
{
    va_list args;
    va_start(args, fmt);

    int i = vsprintf(buf, fmt, args);

    va_end(args);

    printk("!!! panic !!!\n--> %s \n", buf);
    spin("panic()");    // 强制阻塞

    // 不可能运行到这里，否则出错
    // GCC内联汇编
    // UD2 : 让CPU产生invalid opcode exception的软件指令
    //        内核发现CPU出现这个异常时, 会立即停止运行
    asm volatile("ud2");
}